#!/usr/bin/env bash
# Copyright 2020, Trail of Bits, Inc. All rights reserved.

# Get the list of changed C++ header and source files.
STAGED_FILES=$( git diff --cached --name-only --diff-filter=ACM | grep -e '\.\(h\)\|\(cpp\)$' )

if [[ "${STAGED_FILES}" = "" ]]; then
  exit 0
fi

PYTHON3_EXE=$( which python3 )
if [[ "$?" == 1 ]]; then
  echo "\t\033[41mPlease install python3\033[0m"
  exit 1
fi

CLANG_FORMAT_EXE=$( which clang-format )
if [[ "$?" == 1 ]]; then
  echo "\t\033[41mPlease install clang-format\033[0m"
  exit 1
fi

THIS_FILE_DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
NAME_OF_THIS_FILE_DIR=$( basename "${THIS_FILE_DIR}" )
IN_SCRIPTS_DIR=0

# This script being executed is located in the `scripts/` directory.
if [[ "${NAME_OF_THIS_FILE_DIR}" == "scripts" ]] ; then
  SCRIPTS_DIR="${THIS_FILE_DIR}"
  SOURCE_DIR=$( cd "$( dirname "${SCRIPTS_DIR}" )" && pwd )
  IN_SCRIPTS_DIR=1

# This script being executed is located in the `.git/hooks` directory.
elif [[ "${NAME_OF_THIS_FILE_DIR}" == "hooks" ]] ; then
  GIT_DIR=$( cd "$( dirname "${SCRIPTS_DIR}" )" && pwd )
  SOURCE_DIR=$( cd "$( dirname "${GIT_DIR}" )" && pwd )
  SCRIPTS_DIR="${SOURCE_DIR}/scripts"

# Not sure where this script is.
else
  echo "\t\033[41mScript '${BASH_SOURCE[0]}' is in an unexpected location\033[0m"
  echo 1
fi

# Run our wrapper of `clang-format` on the files that have changed.
${PYTHON3_EXE} "${SCRIPTS_DIR}/format-files" \
    --source_dir "${SOURCE_DIR}" \
    --format_exe "${CLANG_FORMAT_EXE}" \
    --files ${STAGED_FILES} \
    --check

if [[ "$?" == 0 ]] ; then
  for staged_file in ${STAGED_FILES} ; do
    git add "${staged_file}"
  done
else
  exit 1
fi
